package br.com.gr.jcash.bo;

import br.com.gr.jcash.dao.GrupoDAO;
import br.com.gr.jcash.dao.UsuarioDAO;
import br.com.gr.jcash.dmp.Grupo;
import br.com.gr.jcash.dmp.Usuario;
import br.com.gr.jcash.exception.JCashException;
import br.com.gr.jcash.iface.IUsuarioBO;
import br.com.gr.jcash.criptografia.Encriptador;
import br.com.gr.jcash.constantes.GrupoEnum;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.Local;
import javax.ejb.Stateless;

@Stateless(mappedName="ejb/UsuarioBO")
@Local(IUsuarioBO.class)
public class UsuarioBO implements IUsuarioBO {

    @EJB
    private UsuarioDAO dao;
    @EJB
    private GrupoDAO grupoDao;

    public UsuarioBO() {
    }

    @Override
    public void criar(Usuario entidade) throws JCashException {
        Usuario user = null;
        user = buscarPorLogin(entidade.getUsuLogin().trim().toLowerCase());
        if (null != user) {
            throw new JCashException("Já existe usuário com o login informado!");
        }
        
        try {
            String senhaCriptografa = Encriptador.sha256HashPassword(entidade.getUsuSenha());
            entidade.setUsuSenha(senhaCriptografa);
            Grupo grupo;
            grupo = grupoDao.buscarPorNomeGrupo(GrupoEnum.USER);
            if (entidade.getGrupoCollection() == null) {
                List<Grupo> lista  = new ArrayList<Grupo>();
                entidade.setGrupoCollection(lista);
            }
            entidade.getGrupoCollection().add(grupo);
        } catch (Exception ex) {
            Logger.getLogger(UsuarioBO.class.getName()).log(Level.SEVERE, null, ex);
            throw new JCashException(ex,"Erro ao preparar os dados para gravar");
        }
        entidade.setUsuLogin(entidade.getUsuLogin().trim().toLowerCase());
        entidade.setUsuNome(entidade.getUsuNome().trim());
        dao.incluir(entidade);
    }

    @Override
    public Usuario editar(Usuario entidade) throws JCashException {
        return dao.atualizar(entidade);
    }

    @Override
    public void remover(Usuario entidade) throws JCashException {
        dao.remover(entidade);
    }

    @Override
    public Usuario buscarPorLogin(String login) throws JCashException {
        return dao.buscarPorLogin(login);
    }

    @Override
    public Usuario buscarPorId(Long id) throws JCashException {
        return dao.buscarPorId(id);
    }

    @Override
    public List<Usuario> buscarTodos() throws JCashException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public List<Usuario> buscarPorFaixa(int[] range) throws JCashException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public Long count() throws JCashException {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
